/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.edu.unal.ahnmodeler.util;

import co.edu.unal.ahnmodeler.model.Node;
import java.awt.Color;
import java.awt.Point;
import java.util.Date;
import java.util.Random;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 *
 * @author raider
 */
public class RandomObjects {
    
    /**
     * Permite calcular un punto aleatorio en el modelo de la red Ad-hoc.
     * @param width Ancho del modelo.
     * @param height Alto del modelo.
     * @return Punto aleatorio en el interior del modelo.
     */
    public static Point randomPoint(int width,int height){
        return new Point((int)(Math.random()*(width-1)), (int)(Math.random()*(height-1)));
    }
    
    /**
     * Permite seleccionar aleatoriamente un nodo del conjunto de nodos que conforman la red Ad-hoc.
     * @param nodes Conjunto de nodos que conforman la red Ad-hoc.
     * @return Nodo seleccionado aleatoriamente del conjunto de nodos.
     */
    public static Node randomNode(CopyOnWriteArrayList<Node> nodes){
        return nodes.get((int)(Math.random()*(nodes.size()-1)));
    }
    
    /**
     * Determina aleatoriamente un valor booleano. Puede ser <i>True</i> o <i>False</i>.
     * @return Valor booleano aleatorio.
     */
    public static boolean randomBoolean(){
        Random random=new Random(new Date().getTime());
        return random.nextBoolean();
    }
    
    /**
     * Permite determinar aleatoriamente un color.
     * @return Color determinado aleatoriamente.
     */
    public static Color randomColor(){
        return new Color((int)(Math.random()*(255)), (int)(Math.random()*(255)), (int)(Math.random()*(255)));
    }
    
    /**
     * Permite calcular aleatoriamente el valor de rango para un nodo en la red Ad-hoc.
     * @return Valor aleatorio del rango para un nodo.
     */
    public static int randomRange(){
        return (int)(Math.random()*(100))+100;
    }
    
    /**
     * Permite calcular aleatoriamente el valor de la velocidad para un nodo en la red Ad-hoc.
     * @return Valor aleatorio de la velocidad para un nodo.
     */
    public static int randomSpeed(){
        return (int)(Math.random()*(40));
    }
    
    /**
     * Permite calcular aleatoriamente el valor de la duración del recorrido para un nodo en la red Ad-hoc.
     * @return Valor aleatorio de la duración del recorrido para un nodo.
     */
    public static int randomWalkTime(){
        return (int)(Math.random()*(9))+1;
    }
    
    /**
     * Permite calcular aleatoriamente el valor de la duración espera en un lugar para un nodo en la red Ad-hoc.
     * @return Valor aleatorio de la duración del recorrido para un nodo.
     */
    public static int randomWaitTime(){
        return (int)(Math.random()*(9))+1;
    }
    
    /**
     * Permite calcular aleatoriamente la dirección de un nodo en la red Ad-hoc.
     * @return Valor aleatorio de la dirección de un nodo.
     */
    public static int randomDirection(){
        return (int)(Math.random()*(7));
    }
    
    /**
     * Permite calcular aleatoriamente el número total de nodos iniciales.
     * @return Número aleatorio de nodos iniciales.
     */
    public static int randomNumNodes(){
        return (int)(Math.random()*(100));
    }
    
    /**
     * Permite calcular aleatoriamente el nivel de energía de un nodo.
     * @return Valor aleatorio del nivel de energía de un nodo.
     */
    public static int randomNodeEnergy(){
        return (int)(Math.random()*(100000)+100000);
    }
    
    /**
     * Permite calcular aleatoriamente el tiempo de espera de un paquete en la cola de un nodo
     * @return
     */
    public static int randomWaitingTime(){
        return (int)(Math.random()*10);
    }
}
